package com.t.bricks.bussiness.component.person;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.t.bricks.bussiness.db.mapper.person.PersonMapper;
import com.t.bricks.model.Log;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 用切面方式监听用户登录的数据操作
 */
@Aspect
@Component
public class PersonMapperAspect {
		
	@Autowired
	private PersonMapper personMapper;
	
	/**
	 * 定义切入点，切入点为'MsgEmity com.t.bricks.bussiness.service.loginuser.impl.LoginUserServiceImpl'下的add函数,并且函数只有1个参数(用?会异常)
	 * 1、execution(public * *(..)) 任意的公共方法
	 * 2、execution(* set*(..)) 以set开头的所有的方法
	 * 3、execution(* com.lingyejun.annotation.LoggerApply.*(..))com.lingyejun.annotation.LoggerApply这个类里的所有的方法
	 * 4、execution(* com.lingyejun.annotation.*.*(..))com.lingyejun.annotation包下的所有的类的所有的方法
	 * 5、execution(* com.lingyejun.annotation..*.*(..))com.lingyejun.annotation包及子包下所有的类的所有的方法
	 * 6、execution(* com.lingyejun.annotation..*.*(String,?,Long)) com.lingyejun.annotation包及子包下所有的类的有三个参数，第一个参数为String类型，第二个参数为任意类型，第三个参数为Long类型的方法
	 * 7、execution(@annotation(com.lingyejun.annotation.Lingyejun))
	 */
	@Pointcut(value = "execution(com.t.bricks.model.MsgEmity com.t.bricks.bussiness.service.loginuser.impl.LoginUserService*.add(Object))")
	public void addMethod() {
	}

	/**
	 * 定义切入点，切入点为'MsgEmity com.t.bricks.bussiness.service.loginuser.impl.LoginUserService'下的del函数,并且函数参数是两个一个整型一个字符串(用?会异常)
	 */
	@Pointcut(value = "execution(com.t.bricks.model.MsgEmity com.t.bricks.bussiness.service.loginuser.impl.LoginUserService*.del(Integer,String))")
	public void delMethod() {
	}

	/**
	 * 定义切入点，切入点为'MsgEmity com.t.bricks.bussiness.service.loginuser.impl.LoginUserService'下的edit函数,并且函数是一个类型为Object的参数(用?会异常)
	 */
	@Pointcut(value = "execution(com.t.bricks.model.MsgEmity com.t.bricks.bussiness.service.loginuser.impl.LoginUserService*.edit(Object))")
	public void editMethod() {
	}
	
	/**
	 * 后置/返回值增强
     * @param joinPoint
     * @param result 被切点方法执行后的返回值
     * @return
	 */
	@AfterReturning(returning="result", pointcut="addMethod()")
	public void afterReturningByAdd(JoinPoint joinPoint, Object result) {
		if (!check(joinPoint, result)) {
			return;
		}

		ModuleUtil.runThread(() -> {//多线程方式重新构造缓存数据
			personMapper.addByUser();//根据用户信息添加人员信息
		});
	}

	/**
	 * 后置/返回值增强
     * @param joinPoint
     * @param result 被切点方法执行后的返回值
     * @return
	 */
	@AfterReturning(returning="result", pointcut="delMethod()")
	public void afterReturningByDel(JoinPoint joinPoint, Object result) {
		if (!check(joinPoint, result)) {
			return;
		}

		ModuleUtil.runThread(() -> {//多线程方式重新构造缓存数据
			personMapper.delByUser();//根据用户信息删除人员信息
		});
	}

	/**
	 * 后置/返回值增强
     * @param joinPoint
     * @param result 被切点方法执行后的返回值
     * @return
	 */
	@AfterReturning(returning="result", pointcut="editMethod()")
	public void afterReturningByEdit(JoinPoint joinPoint, Object result) {
		if (!check(joinPoint, result)) {
			return;
		}

		ModuleUtil.runThread(() -> {//多线程方式重新构造缓存数据
			personMapper.editByUser();//根据用户信息修改人员信息中的部分信息
		});
	}

	/**
	 * 后置/返回值增强
     * @param joinPoint
     * @param result 被切点方法执行后的返回值
     * @return
	 */
	private boolean check(JoinPoint joinPoint, Object result) {
		if (!(result instanceof MsgEmity)) {//不是返回MsgEmity,则说明不是要进行的
			MethodSignature signature = (MethodSignature) joinPoint.getSignature();
			String methodName = signature.getMethod().getName();
			Log.error("方法'", methodName, "'返回数据不是MsgEmity");
			return false;
		}

		return ((MsgEmity)result).isSuccess();
	}

}
